﻿package mortal.game.scene3D.map3D.AstarAnyDirection
{
    import __AS3__.vec.*;
    import flash.utils.*;
    import mortal.game.*;
    import mortal.game.resource.*;
    import mortal.game.resource.tableConfig.*;
    import mortal.game.scene3D.map3D.*;
    import mortal.game.scene3D.map3D.AstarAnyDirection.data.*;
    import mortal.game.scene3D.map3D.AstarAnyDirection.processor.*;
    import mortal.game.scene3D.map3D.sceneInfo.*;
    import mortal.game.scene3D.map3D.util.*;

    public class AstarCache extends Object
    {
        private var _mapLinks:Dictionary;
        private static var _instance:AstarCache;

        public function AstarCache()
        {
            this._mapLinks = new Dictionary();
            return;
        }// end function

        public function getLink(param1:int, param2:int) : Vector.<AstarIIPoint>
        {
            var _loc_3:* = param1.toString() + "_" + param2.toString();
            var _loc_4:* = this._mapLinks[_loc_3];
            if (_loc_4 == null)
            {
                return null;
            }
            this.resetLink(_loc_4);
            return _loc_4;
        }// end function

        public function setLink(param1:int, param2:Array, param3:int, param4:Boolean = false) : void
        {
            var _loc_9:int = 0;
            var _loc_10:AstarIIPoint = null;
            var _loc_12:Array = null;
            var _loc_13:Vector.<AstarIIPoint> = null;
            var _loc_14:Array = null;
            var _loc_15:Dictionary = null;
            var _loc_16:String = null;
            var _loc_17:Array = null;
            var _loc_5:* = param1.toString() + "_" + param3.toString();
            if (!param4 && this._mapLinks[_loc_5] != null)
            {
                return;
            }
            var _loc_6:* = new Vector.<AstarIIPoint>;
            var _loc_7:* = this.addJumpPointGrid(param1, _loc_6);
            var _loc_8:* = _loc_6.concat();
            var _loc_11:* = MapCutDataConfig.instance.getMapDataJSONStr(param1);
            if (_loc_11 != null)
            {
                _loc_12 = JSON.parse(_loc_11) as Array;
                _loc_13 = new Vector.<AstarIIPoint>;
                _loc_9 = 0;
                while (_loc_9 < _loc_12.length)
                {
                    
                    _loc_14 = _loc_12[_loc_9];
                    _loc_10 = new AstarIIPoint(_loc_14[0], _loc_14[1], _loc_14[2], _loc_14[3]);
                    _loc_13.push(_loc_10);
                    _loc_9++;
                }
                _loc_6 = _loc_13.concat(_loc_6);
                MapGridLinker.calcLink(_loc_6, _loc_8);
                this._mapLinks[_loc_5] = _loc_6;
            }
            else
            {
                _loc_15 = new Dictionary();
                _loc_9 = 0;
                while (_loc_9 < _loc_8.length)
                {
                    
                    _loc_10 = _loc_8[_loc_9];
                    _loc_15[_loc_10.row + "_" + _loc_10.col] = param2[_loc_10.row][_loc_10.col];
                    param2[_loc_10.row][_loc_10.col] = param3 - 1;
                    _loc_9++;
                }
                _loc_6 = MapGridCutter.cutMap(param2, param3).concat(_loc_6);
                this._mapLinks[_loc_5] = _loc_6;
                MapGridLinker.calcLink(this._mapLinks[_loc_5], _loc_8);
                for (_loc_16 in _loc_15)
                {
                    
                    _loc_17 = _loc_16.split("_");
                    param2[int(_loc_17[0])][int(_loc_17[1])] = _loc_15[_loc_16];
                }
            }
            return;
        }// end function

        public function resetLink(param1:Vector.<AstarIIPoint>) : void
        {
            var _loc_2:int = 0;
            var _loc_3:AstarIIPoint = null;
            _loc_2 = param1.length;
            var _loc_4:int = 0;
            while (_loc_4 < _loc_2)
            {
                
                _loc_3 = param1[_loc_4];
                _loc_3.parent = null;
                _loc_3.linkTM = -1;
                _loc_3.f = 0;
                _loc_3.g = 0;
                _loc_3.h = 0;
                _loc_4++;
            }
            return;
        }// end function

        public function saveCurrentCut() : void
        {
            var _loc_11:String = null;
            var _loc_12:AstarIIPoint = null;
            var _loc_13:AstarIIPoint = null;
            var _loc_14:Array = null;
            var _loc_15:Array = null;
            var _loc_1:* = Game.mapInfo.mapId;
            var _loc_2:* = Game.mapInfo.mapData;
            var _loc_3:* = MapNodeType.WALK_MIN_VALUE;
            var _loc_4:* = new Dictionary();
            var _loc_5:* = new Vector.<AstarIIPoint>;
            var _loc_6:* = this.addJumpPointGrid(_loc_1, _loc_5);
            var _loc_7:* = _loc_5.concat();
            var _loc_8:int = 0;
            while (_loc_8 < _loc_7.length)
            {
                
                _loc_12 = _loc_7[_loc_8];
                _loc_4[_loc_12.row + "_" + _loc_12.col] = _loc_2[_loc_12.row][_loc_12.col];
                _loc_2[_loc_12.row][_loc_12.col] = _loc_3 - 1;
                _loc_8++;
            }
            _loc_5 = MapGridCutter.cutMap(_loc_2, _loc_3);
            var _loc_9:Array = [];
            _loc_8 = 0;
            while (_loc_8 < _loc_5.length)
            {
                
                _loc_13 = _loc_5[_loc_8];
                _loc_14 = [];
                _loc_14.push(_loc_13.row, _loc_13.col, _loc_13.endRow, _loc_13.endCol);
                _loc_9.push(_loc_14);
                _loc_8++;
            }
            var _loc_10:* = JSON.stringify(_loc_9);
            for (_loc_11 in _loc_4)
            {
                
                _loc_15 = _loc_11.split("_");
                _loc_2[int(_loc_15[0])][int(_loc_15[1])] = _loc_4[_loc_11];
            }
            return;
        }// end function

        private function addJumpPointGrid(param1:int, param2:Vector.<AstarIIPoint>) : Dictionary
        {
            var _loc_9:int = 0;
            var _loc_10:int = 0;
            var _loc_11:AstarIIPoint = null;
            var _loc_3:* = SceneConfig.instance.getSceneInfo(param1);
            if (_loc_3 == null)
            {
                return null;
            }
            var _loc_4:* = _loc_3.jumpPoints;
            if (_loc_4 == null || _loc_4.length < 2)
            {
                return null;
            }
            var _loc_5:* = GameMapUtil.tileWidth;
            var _loc_6:* = GameMapUtil.tileHeight;
            var _loc_7:* = new Dictionary();
            var _loc_8:int = 0;
            while (_loc_8 < _loc_4.length)
            {
                
                _loc_9 = _loc_4[_loc_8].x / _loc_5;
                _loc_10 = _loc_4[_loc_8].y / _loc_6;
                _loc_11 = new AstarIIPoint(_loc_9, _loc_10, (_loc_9 + 1), (_loc_10 + 1));
                _loc_11.isJump = true;
                param2.push(_loc_11);
                _loc_9 = _loc_4[(_loc_8 + 1)].x / _loc_5;
                _loc_10 = _loc_4[(_loc_8 + 1)].y / _loc_6;
                _loc_11 = new AstarIIPoint(_loc_9, _loc_10, (_loc_9 + 1), (_loc_10 + 1));
                _loc_11.isJump = true;
                param2.push(_loc_11);
                _loc_7[_loc_9 * 10000 + _loc_10] = true;
                _loc_8 = _loc_8 + 2;
            }
            return _loc_7;
        }// end function

        public static function get instance() : AstarCache
        {
            if (_instance == null)
            {
                _instance = new AstarCache;
            }
            return _instance;
        }// end function

    }
}
